package co.edu.udea.xyz.dao.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.xyz.dao.ProductoDAO;
import co.edu.udea.xyz.dto.Producto;
import co.edu.udea.xyz.util.exception.XYZException;

/**
 * Clase ProductoDAOHibernate 
 * Hereda HibernateDaoSupport
 * Implementa ProductoDAO
 * 
 * Contiene los metodos para el manejo de los Productos.
 * @author CesarGuapacha
 *
 */
public class ProductoDAOHibernate extends HibernateDaoSupport implements
		ProductoDAO {

	public ProductoDAOHibernate() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Metodo para obtener una lista de Productos
	 * que contiene la tabla PRODUCTOS de la Base de Datos.
	 */
	@Override
	public List<Producto> obtener() throws XYZException {
		Session session = null;
		List<Producto> productos = new ArrayList<Producto>();
		
		try{
			session = getSession();
			Criteria criteria = session.createCriteria(Producto.class);
			productos = criteria.list();
		}catch(HibernateException e){
			throw new 	XYZException(e);
		}
		return productos;
	}

	/**
	 * Metodo Obtener producto segun la idProducto.
	 * @param idProducto del Producto
	 * return producto
	 * 
	 */
	@Override
	public Producto obtener(int idProducto) throws XYZException {
		Session session = null;
		Producto producto = null;
		
		try{
			session = getSession();
			producto = (Producto)session.get(Producto.class, idProducto);
				
		}catch(HibernateException e){
			throw new XYZException(e);
		}
		return producto;
	}

	/**
	 * Metodo que guarda un producto en la base de datos
	 * @param Producto
	 */
	@Override
	public void guardar(Producto producto) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.save(producto);
						
		}catch(HibernateException e){
			throw new XYZException(e);
		}

	}

	/**
	 * Metodo que actualiza un producto en la base de datos
	 * @param Producto
	 */
	@Override
	public void actualizar(Producto producto) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.update(producto);
						
		}catch(HibernateException e){
			throw new XYZException(e);
		}

	}

}
